home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
BF_SDK11.ZIP
/
CPP_DEMO.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-06
|
8KB
|
227 lines
// CPP_DEMO.CPP
// test program for BFENG.OBJ
// programming language: MS Visual C++ 1.0, QuickWin
// memory model: large
// last update: 05/25/96
// (c)1996 Markus Hahn
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "blowfish.h"
// official testvectors from DDJ 10/95...
unsigned char key1[] = "abcdefghijklmnopqrstuvwxyz";
unsigned long testdata1_p[2] = {0x424c4f57, 0x46495348};
unsigned long testdata1_c[2] = {0x324ed0fe, 0xf413a203};
unsigned char key2[] = "Who is John Galt?";
unsigned long testdata2_p[2] = {0xfedcba98, 0x76543210};
unsigned long testdata2_c[2] = {0xcc91732b, 0x8022f684};
#define BIGBUFSIZE 32000
#define TESTLOOPS 400UL
// random32() - creates 32bit random value, don't use this in real crypt apps
unsigned long random32()
{
return ((unsigned long)rand() << 16) | (unsigned long)rand();
};
// global data...
unsigned long ulCBCIVL; // IV == initalisation vector
unsigned long ulCBCIVR;
unsigned long ulCBCLeft;
unsigned long ulCBCRight;
unsigned char sMyKey[256];
unsigned long testbuf[6];
unsigned int unI;
unsigned long ulStart;
unsigned long ulTime;
unsigned long ulRate;
unsigned long *pBoxes;
unsigned long BF_key[1058];
unsigned char biggy[BIGBUFSIZE];
clock_t needed_time;
int main()
{
// init. the random generator
srand((unsigned)time(NULL));
// save original boxes
Blowfish_GetBoxes(BF_key);
Blowfish_SetRounds(16);
// en- and decrypt the test vectors...
// #1
puts("test vector #1...");
Blowfish_Init(key1, sizeof(key1)-1);
// show the first 6 p-boxes
pBoxes=(unsigned long*)Blowfish_GetBoxPointer;
puts("pboxes:");
for (unI=0; unI<5; unI++) printf("%08lx ", pBoxes[unI]);
puts("");
// now encrypt, decrypt and compare with the official values
printf("plaintext : %08lx %08lx\n", testdata1_p[0], testdata1_p[1]);
Blowfish_ECBEncrypt(testdata1_p, 8);
printf("ciphertext: %08lx %08lx\n", testdata1_p[0], testdata1_p[1]);
printf("DDJ 10/95 : %08lx %08lx\n", testdata1_c[0], testdata1_c[1]);
Blowfish_ECBDecrypt(testdata1_p, 8);
printf("decrypted : %08lx %08lx\n", testdata1_p[0], testdata1_p[1]);
puts("");
// #2
puts("test vector #2...");
Blowfish_SetBoxes(BF_key); // reload original boxes
Blowfish_Init(key2, sizeof(key2)-1);
pBoxes=(unsigned long*)Blowfish_GetBoxPointer;
puts("pboxes:");
for (unI=0; unI<5; unI++) printf("%08lx ", pBoxes[unI]);
puts("");
printf("plaintext : %08lx %08lx\n", testdata2_p[0], testdata2_p[1]);
Blowfish_ECBEncrypt(testdata2_p, 8);
printf("ciphertext: %08lx %08lx\n", testdata2_p[0], testdata2_p[1]);
printf("DDJ 10/95 : %08lx %08lx\n", testdata2_c[0], testdata2_c[1]);
Blowfish_ECBDecrypt(testdata2_p, 8);
printf("decrypted : %08lx %08lx\n", testdata2_p[0], testdata2_p[1]);
puts("press ENTER...\n");
getchar();
// start ECB tests with a small buffer...
// 16 rounds...
Blowfish_SetBoxes(BF_key); // reload original boxes
strcpy((char*) sMyKey, "I think I climb aboard!");
Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
puts("ECB test 16 round...");
puts("original data:");
// generate and show random numbers...
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]=random32());
puts("\nencrypted data:");
Blowfish_ECBEncrypt(testbuf, 6*4);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\ndecrypted data:");
Blowfish_ECBDecrypt(testbuf, 6*4);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\n");
// 32 rounds...
Blowfish_SetRounds(32); // change number of encryption rounds
Blowfish_SetBoxes(BF_key);
strcpy((char*) sMyKey, "I think I climb aboard!");
Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
puts("ECB test 32 round...");
puts("original data:");
// (to show the difference we do NOT create new test data)
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\nencrypted data:");
Blowfish_ECBEncrypt(testbuf, 6*4);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\ndecrypted data:");
Blowfish_ECBDecrypt(testbuf, 6*4);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\npress ENTER...\n");
getchar();
// start CBC tests with a small buffer...
// 16 rounds...
ulCBCLeft=random32(); // init. and save the CBC IV
ulCBCRight=random32();
ulCBCIVL=ulCBCLeft;
ulCBCIVR=ulCBCRight;
Blowfish_SetRounds(16); // reset to 16 encryption rounds
Blowfish_SetBoxes(BF_key); // reload original boxes
strcpy((char*) sMyKey, "Who wants some?");
Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
puts("CBC test 16 round...");
printf("IV: %08lx %08lx\n", ulCBCLeft, ulCBCRight);
puts("original data:");
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\nencrypted data:");
Blowfish_CBCEncrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\ndecrypted data:");
// restore the original CBC IV for decryption
ulCBCIVL=ulCBCLeft;
ulCBCIVR=ulCBCRight;
Blowfish_CBCDecrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\n");
// 32 rounds...
ulCBCIVL=ulCBCLeft; // use the same CBC IV as above
ulCBCIVR=ulCBCRight;
Blowfish_SetRounds(32); // set to 32 encryption rounds
Blowfish_SetBoxes(BF_key); // reload original boxes
strcpy((char*) sMyKey, "Who wants some?");
Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
puts("CBC test 32 round...");
printf("IV: %08lx %08lx\n", ulCBCLeft, ulCBCRight);
puts("original data:");
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\nencrypted data:");
Blowfish_CBCEncrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\ndecrypted data:");
ulCBCIVL=ulCBCLeft;
ulCBCIVR=ulCBCRight;
Blowfish_CBCDecrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]);
puts("\npress ENTER...\n");
getchar();
// benchmark tests, done in CBC mode with a 32kB buffer
puts("benchmark test\n16 rounds running...");
Blowfish_SetRounds(16);
needed_time=clock();
for (unI=0; unI<TESTLOOPS; unI++)
Blowfish_CBCEncrypt((unsigned long*) biggy, BIGBUFSIZE, &ulCBCIVL, &ulCBCIVL);
needed_time=clock()-needed_time;
ulRate=( (TESTLOOPS * BIGBUFSIZE) / needed_time) * CLK_TCK;
printf("%ld bytes per second\n", ulRate);
puts("32 rounds running...");
Blowfish_SetRounds(32);
needed_time=clock();
for (unI=0; unI<TESTLOOPS; unI++)
Blowfish_CBCEncrypt((unsigned long*) biggy, BIGBUFSIZE, &ulCBCIVL, &ulCBCIVL);
needed_time=clock()-needed_time;
ulRate=( (TESTLOOPS * BIGBUFSIZE) / needed_time) * CLK_TCK;
printf("%ld bytes per second\n", ulRate);
return getchar();
};